home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 33
/
Amiga Format AFCD33 (Issue 117, Dec 1998).iso
/
-seriously_amiga-
/
graphics
/
splitmpegppc
/
src
/
util.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-09-07
|
5KB
|
234 lines
/*
* Copyright (c) 1992 The Regents of the University of California.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written agreement is
* hereby granted, provided that the above copyright notice and the following
* two paragraphs appear in all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* I can be contacted via
* Email: michael@ecel.uwa.edu.au
* Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
*
* Amigaversion by Tobias Seiler in 1997
* Email: tabs@blader.com
*/
#include "main.h"
#include "proto.h"
/*
*--------------------------------------------------------------
*
* correct_underflow --
*
* Called when buffer does not have sufficient data to
* satisfy request for bits.
* Calls get_more_data, an application specific routine
* required to fill the buffer with more data.
*
* Results:
* None really.
*
* Side effects:
* buf_length and buffer fields in curVidStream structure
* may be changed.
*
*--------------------------------------------------------------
*/
void correct_underflow()
{
int status;
status = get_more_data( buf_start, max_buf_length, &bufLength, &bitBuffer);
if (status < 0) {
longjmp(env,ERR_READ_BITSTREAM);
}else if ((status == 0) && (bufLength < 1)) {
longjmp(env,ERR_UNEXPECTED_EOF);
}
curBits = *bitBuffer;
}
/*
*--------------------------------------------------------------
*
* next_bits --
*
* Compares next num bits to low order position in mask.
* Buffer pointer is NOT advanced.
*
* Results:
* TRUE, FALSE, or error code.
*
* Side effects:
* None.
*
*--------------------------------------------------------------
*/
int next_bits(int num, unsigned int mask)
{
unsigned int stream;
int ret_value;
/* If no current stream, return error. */
if (BitStream == NULL)
longjmp(env,ERR_NO_BIT_STREAM);
/* Get next num bits, no buffer pointer advance. */
show_bitsn(num, &stream);
/* Compare bit stream and mask. Set return value toTRUE if equal, FALSE if
differs.
*/
if (mask == stream) {
ret_value = TRUE;
} else ret_value = FALSE;
/* Return return value. */
return ret_value;
}
/*
*--------------------------------------------------------------
*
* next_start_code --
*
* Parses off bitstream until start code reached. When done
* next 4 bytes of bitstream will be start code. Bit offset
* reset to 0.
*
* Results:
* Status code.
*
* Side effects:
* Bit stream irreversibly parsed.
*
*--------------------------------------------------------------
*/
int next_start_code(void)
{
int state;
int byteoff;
unsigned int data;
/* If no current stream, return error. */
if (BitStream == NULL)
longjmp(env,ERR_NO_BIT_STREAM);
/* If insufficient buffer length, correct underflow. */
if (bufLength < 2) {
correct_underflow();
}
/* If bit offset not zero, reset and advance buffer pointer. */
byteoff = bitOffset % 8;
if (byteoff != 0) {
bitOffset += (8-byteoff);
if (bitOffset > 31) {
bitBuffer++;
curBits = *bitBuffer;
bufLength--;
bitOffset = 0;
}
}
/* Set state = 0. */
state = 0;
/* While buffer has data ... */
while(bufLength > 0) {
/* If insufficient data exists, correct underflow. */
if (bufLength < 2) {
correct_underflow();
}
/* If next byte is zero... */
get_bits8(&data);
if (data == 0) {
/* If state < 2, advance state. */
if (state < 2) state++;
}
/* If next byte is one... */
else if (data == 1) {
/* If state == 2, advance state (i.e. start code found). */
if (state == 2) state++;
/* Otherwise, reset state to zero. */
else state = 0;
}
/* Otherwise byte is neither 1 or 0, reset state to 0. */
else {
state = 0;
}
/* If state == 3 (i.e. start code found)... */
if (state == 3) {
/* Set buffer pointer back and reset length & bit offsets so
next bytes will be beginning of start code.
*/
bitOffset = bitOffset - 24;
if (bitOffset < 0) {
bitOffset = 32 + bitOffset;
bufLength++;
bitBuffer--;
curBits = *bitBuffer;
}
/* Return success. */
return OK;
}
}
/* Return underflow error. */
return BUF_UNDERFLOW;
}